package com.njitzx.fileupload.util;

import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.File;

public class MD5Util {

    /**
     * 计算文件的 MD5 值
     *
     * @param file 文件
     * @return 文件的 MD5 值（32位十六进制字符串）
     */
    public static String getFileMD5(MultipartFile file) {
        try (InputStream fis = file.getInputStream()) {
            // 创建 MessageDigest 实例，使用 MD5 算法
            MessageDigest digest = MessageDigest.getInstance("MD5");

            byte[] buffer = new byte[1024];
            int bytesRead;

            // 读取文件并更新 MD5 计算
            while ((bytesRead = fis.read(buffer)) != -1) {
                digest.update(buffer, 0, bytesRead);
            }

            // 获取 MD5 哈希值的字节数组
            byte[] md5Bytes = digest.digest();

            // 将字节数组转换为 32 位十六进制字符串
            StringBuilder md5String = new StringBuilder();
            for (byte b : md5Bytes) {
                md5String.append(String.format("%02x", b));
            }

            return md5String.toString();  // 返回文件的 MD5 值

        } catch (NoSuchAlgorithmException | IOException e) {
            e.printStackTrace();
        }
        return null;  // 出现异常时返回 null
    }

    /**
     * 计算字符串的 MD5 值
     *
     * @param input 输入的字符串
     * @return 字符串的 MD5 值（32位十六进制字符串）
     */
    public static String getStringMD5(String input) {
        try {
            // 创建 MessageDigest 实例，使用 MD5 算法
            MessageDigest digest = MessageDigest.getInstance("MD5");

            // 获取字符串的字节数组
            byte[] inputBytes = input.getBytes();

            // 计算 MD5 哈希值
            byte[] md5Bytes = digest.digest(inputBytes);

            // 将字节数组转换为 32 位十六进制字符串
            StringBuilder md5String = new StringBuilder();
            for (byte b : md5Bytes) {
                md5String.append(String.format("%02x", b));
            }

            return md5String.toString();  // 返回字符串的 MD5 值

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;  // 出现异常时返回 null
    }

}

